package com.kmlitro.entity.dao;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import com.kmlitro.entity.Usuario;
import com.kmlitro.entity.dao.db.DBManager;
import com.kmlitro.utils.DateUtils;

public class UsuarioDAO {
	
	public void createNewAccount(Usuario usuario) throws Exception {
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = DBManager.getInstance().getConnectionMysql();
			
			String sql = "INSERT INTO tb_kml_usuario (KML_EMAIL_USUARIO, KML_SENHA_USUARIO, KML_NM_USUARIO, KML_CPF_USUARIO, " +
					"KML_DTNASC_USUARIO, KML_CEP_USUARIO, KML_LOGRADOURO_USUARIO, KML_COMPLEMENTO_USUARIO, KML_BAIRRO_USUARIO, KML_CIDADE_USUARIO, " +
					"KML_ESTADO_USUARIO, KML_SEXO_USUARIO) VALUES (?, MD5(?), ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			
			pstmt = conn.prepareStatement(sql.toUpperCase());
			pstmt.setString(1, usuario.getEmail());
			pstmt.setString(2, usuario.getSenha());
			pstmt.setString(3, usuario.getNome());
			pstmt.setString(4, usuario.getCpf());
			pstmt.setDate(5, DateUtils.convertDate(usuario.getNascimento()));
			pstmt.setString(6, usuario.getCep());
			pstmt.setString(7, usuario.getLogradouro());
			pstmt.setString(8, usuario.getComplemento());
			pstmt.setString(9, usuario.getBairro());
			pstmt.setString(10, usuario.getCidade());
			pstmt.setString(11, usuario.getEstado());
			pstmt.setInt(12, usuario.getSexo());
			
			pstmt.executeUpdate();
			
			
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			try{
				if (pstmt != null){
					pstmt.close();	
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
				throw new Exception(e);
			}
		}
		
	}
	
	public Usuario login(String email, String senha) throws Exception {

		Usuario usuario = new Usuario();
		
		if(null == email || "".equals(email)) {
			return null;
		}
		if(null == senha || "".equals(senha)) {
			return null;
		}
		
		if(email.indexOf("'") != -1 || email.indexOf("\"") != -1 || email.indexOf("=") != -1 || email.indexOf("--") != -1) {
			throw new Exception(com.kmlitro.exception.Exception.NICK_SPECIAL_CHARACTER);
		}
		if(senha.indexOf("'") != -1 || senha.indexOf("\"") != -1 || senha.indexOf("=") != -1 || senha.indexOf("--") != -1) {
			throw new Exception(com.kmlitro.exception.Exception.PASS_SPECIAL_CHARACTER);
		}
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		
		try {
			conn = DBManager.getInstance().getConnectionMysql();
			
			String sql = "select * from tb_kml_usuario";
			
			if (email.toLowerCase().matches("^[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)*@(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\\.)+[a-z0-9](?:[a-z0-9-]*[a-z0-9])?$")) {
				sql += " where kml_email_usuario = ? and kml_senha_usuario = MD5(?) limit 1";
			} else {
				if (senha.length() >= 32) {
					sql += " where kml_email_usuario = ? and kml_senha_usuario = ? limit 1";
				} else {
					sql += " where kml_email_usuario = ? and kml_email_usuario = MD5(?) limit 1";
				}
			}
			
			pstmt = conn.prepareStatement(sql.toUpperCase());
			pstmt.setString(1, email);
			pstmt.setString(2, senha);
			
			rs = pstmt.executeQuery();
			
			if(null != rs && rs.next()){
				usuario.setId(Integer.parseInt(rs.getString("kml_id_usuario")));
				usuario.setEmail(rs.getString("kml_email_usuario"));
				usuario.setSenha(rs.getString("kml_senha_usuario"));
				usuario.setCadastro(rs.getTimestamp("kml_dtcadastro_usuario"));
				usuario.setNome(rs.getString("kml_nm_usuario"));
				usuario.setCpf(rs.getString("kml_cpf_usuario"));
				usuario.setNascimento(rs.getDate("kml_dtnasc_usuario"));
				usuario.setCep(rs.getString("kml_cep_usuario"));
				usuario.setLogradouro(rs.getString("kml_logradouro_usuario"));
				usuario.setComplemento(rs.getString("kml_complemento_usuario"));
				usuario.setBairro(rs.getString("kml_bairro_usuario"));
				usuario.setCidade(rs.getString("kml_cidade_usuario"));
				usuario.setEstado(rs.getString("kml_estado_usuario"));
				usuario.setSexo(rs.getInt("kml_sexo_usuario"));
			}
			
		} catch (SQLException e) {
			e.printStackTrace();
		} finally {
			try{
				if (rs != null){
					rs.close();	
				}
				if (pstmt != null){
					pstmt.close();	
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				throw new Exception(e);
			}		
		}
		
		return usuario;
	}
	
	public void editUserAccount(Usuario usuario) throws Exception {
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		
		try {
			conn = DBManager.getInstance().getConnectionMysql();
			
			String sql="UPDATE TB_KML_USUARIO " +
			"SET KML_EMAIL_USUARIO = ?, " +
			"KML_NM_USUARIO = ?, " +
			"KML_SEXO_USUARIO = ?, " +
			"KML_CEP_USUARIO = ?, " +
			"KML_LOGRADOURO_USUARIO = ?, " +
			"KML_COMPLEMENTO_USUARIO = ?, " +
			"KML_BAIRRO_USUARIO = ?, " +
			"KML_CIDADE_USUARIO = ?, " +
			"KML_ESTADO_USUARIO = ? " +
			"WHERE KML_ID_USUARIO = ?";
			
			pstmt = conn.prepareStatement(sql);

			pstmt.setString(1, usuario.getEmail());
			pstmt.setString(2, usuario.getNome());
			pstmt.setInt(3, usuario.getSexo());
			pstmt.setString(4, usuario.getCep());
			pstmt.setString(5, usuario.getLogradouro());
			pstmt.setString(6, usuario.getComplemento());
			pstmt.setString(7, usuario.getBairro());
			pstmt.setString(8, usuario.getCidade());
			pstmt.setString(9, usuario.getEstado());
			pstmt.setInt(10, usuario.getId());
			
			pstmt.executeUpdate();
			
			
		} catch (Exception e) {
			e.printStackTrace();
			throw e;
		} finally {
			try{
				if (pstmt != null){
					pstmt.close();	
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
				throw new Exception(e);
			}
		}
		
	}
	
	public Usuario getUser(int id) throws Exception{
		
		Usuario usuario = new Usuario();
		
		Connection conn = null;
		PreparedStatement pstmt = null;
		ResultSet rs = null;
		
		
		try {
			conn = DBManager.getInstance().getConnectionMysql();
			
			String sql = "select * from tb_kml_usuario where kml_id_usuario = ? ";
			
			pstmt = conn.prepareStatement(sql.toUpperCase());
			
			pstmt.setInt(1, id);
			
			rs = pstmt.executeQuery();
			
			if(null != rs && rs.next()){
				usuario.setId(Integer.parseInt(rs.getString("kml_id_usuario")));
				usuario.setEmail(rs.getString("kml_email_usuario"));
				usuario.setSenha(rs.getString("kml_senha_usuario"));
				usuario.setCadastro(rs.getDate("kml_dtcadastro_usuario"));
				usuario.setNome(rs.getString("kml_nm_usuario"));
				usuario.setCpf(rs.getString("kml_cpf_usuario"));
				usuario.setNascimento(rs.getDate("kml_dtnasc_usuario"));
				usuario.setCep(rs.getString("kml_cep_usuario"));
				usuario.setLogradouro(rs.getString("kml_logradouro_usuario"));
				usuario.setComplemento(rs.getString("kml_complemento_usuario"));
				usuario.setBairro(rs.getString("kml_bairro_usuario"));
				usuario.setCidade(rs.getString("kml_cidade_usuario"));
				usuario.setEstado(rs.getString("kml_estado_usuario"));
				usuario.setSexo(rs.getInt("kml_sexo_usuario"));
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try{
				if (rs != null){
					rs.close();	
				}
				if (pstmt != null){
					pstmt.close();	
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				throw new Exception(e);
			}		
		}
		
		
		return usuario;
	}

	public boolean emailExists(String email) {
		boolean exists = false;
		
		String query = "SELECT 1 FROM TB_KML_USUARIO WHERE KML_EMAIL_USUARIO = ?";
		
		Connection conn = null;
		PreparedStatement stmt = null;
		ResultSet rs = null;

		try {
			conn = DBManager.getInstance().getConnectionMysql();
			
			stmt = conn.prepareStatement(query);
			stmt.setString(1, email);
			
			rs = stmt.executeQuery();
			
			if(rs.next()) {
				exists = true;
			}
			
		} catch (Exception e) {
			e.printStackTrace();
		} finally {
			try{
				if(rs != null) {
					rs.close();
				}
				if (stmt != null){
					stmt.close();	
				}
				if (conn != null) {
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}				
		}
		
		return exists;
	}

}
